home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / drivers / mscdex / inst_cd / msrlec / playrle.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-10  |  3.1 KB  |  131 lines

  1. /*--------------------------------------------------------------------------*\
  2. |   PlayRLE.C - RLE display code
  3. |                                                                            |
  4. \*--------------------------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "rle.h"
  8.  
  9. #define RLE_ESCAPE  0
  10. #define RLE_EOL     0
  11. #define RLE_EOF     1
  12. #define RLE_JMP     2
  13. #define RLE_RUN     3
  14.  
  15. extern WORD PASCAL __WinFlags;
  16. #define WinFlags (WORD)(&__WinFlags)
  17.  
  18. typedef BYTE huge * HPRLE;
  19. typedef BYTE far  * LPRLE;
  20.  
  21. void NEAR PASCAL DecodeRle(LPBITMAPINFOHEADER lpbi, HPRLE  pb, HPRLE prle);
  22.  
  23. //
  24. // these are in RLEA.ASM
  25. //
  26. void NEAR PASCAL DecodeRle286(LPBITMAPINFOHEADER lpbi, LPBYTE pb, LPBYTE prle);
  27. void NEAR PASCAL DecodeRle386(LPBITMAPINFOHEADER lpbi, LPBYTE pb, LPBYTE prle);
  28.  
  29. #define DibPtr(hdib) ((LPBYTE)GlobalLock(hdib) + \
  30.             (int)((LPBITMAPINFOHEADER)GlobalLock(hdib))->biSize + \
  31.             (int)((LPBITMAPINFOHEADER)GlobalLock(hdib))->biClrUsed * sizeof(RGBQUAD) )
  32.  
  33. void PlayRle(LPBITMAPINFOHEADER lpbi, LPVOID pDib, LPVOID pRLE)
  34. {
  35.     DWORD dw;
  36.  
  37.     dw = (DWORD)(WORD)lpbi->biHeight * (DWORD)(WORD)lpbi->biWidth;
  38.  
  39.     if (dw < 65536l)
  40.         DecodeRle286(lpbi, pDib, pRLE);
  41.     else if (WinFlags & WF_CPU286)
  42.         DecodeRle(lpbi, pDib, pRLE);
  43.     else
  44.         DecodeRle386(lpbi, pDib, pRLE);
  45. }
  46.  
  47. //  PlayRleDib
  48. //
  49. //  Play back a RLE buffer into a DIB
  50. //
  51. //      hdib        - dest DIB
  52. //      x,y         - position in dest DIB where to place RLE
  53. //      hrle        - src RLE
  54. //
  55. //  returns
  56. //
  57. //      none
  58. //
  59. void PlayRleDib(HANDLE hdib, HANDLE hrle)
  60. {
  61.     PlayRle((LPBITMAPINFOHEADER) GlobalLock(hdib), DibPtr(hdib), DibPtr(hrle));
  62. }
  63.  
  64. //
  65. //  DecodeRle   - 'C' version
  66. //
  67. //  Play back a RLE buffer into a DIB buffer
  68. //
  69. //  returns
  70. //      none
  71. //
  72. void NEAR PASCAL DecodeRle(LPBITMAPINFOHEADER lpbi, HPRLE pb, HPRLE prle)
  73. {
  74.     BYTE    cnt;
  75.     BYTE    b;
  76.     WORD    x;
  77.     WORD    dx,dy;
  78.     WORD    wWidthBytes;
  79.  
  80.     wWidthBytes = (WORD)lpbi->biWidth+3 & ~3;
  81.  
  82.     x = 0;
  83.  
  84.     for(;;)
  85.     {
  86.         cnt = *prle++;
  87.         b   = *prle++;
  88.  
  89.         if (cnt == RLE_ESCAPE)
  90.         {
  91.             switch (b)
  92.             {
  93.                 case RLE_EOF:
  94.                     return;
  95.  
  96.                 case RLE_EOL:
  97.                     pb += wWidthBytes - x;
  98.                     x = 0;
  99.                     break;
  100.  
  101.                 case RLE_JMP:
  102.                     dx = (WORD)*prle++;
  103.                     dy = (WORD)*prle++;
  104.  
  105.                     pb += (DWORD)wWidthBytes * dy + dx;
  106.                     x  += dx;
  107.  
  108.                     break;
  109.  
  110.                 default:
  111.                     cnt = b;
  112.                     x  += cnt;
  113.                     while (cnt-- > 0)
  114.                         *pb++ = *prle++;
  115.  
  116.                     if (b & 1)
  117.                         prle++;
  118.  
  119.                     break;
  120.             }
  121.         }
  122.         else
  123.         {
  124.             x += cnt;
  125.  
  126.             while (cnt-- > 0)
  127.                 *pb++ = b;
  128.         }
  129.     }
  130. }
  131.